import dayjs from "dayjs";
import "dayjs/locale/zh-cn"; // 导入中文语言包
// 设置 dayjs 使用中文 locale
dayjs.locale("zh-cn");
// 获取当前日期往前数 N 天的日期区间
export function getPastDateRange(time, days) {
  const currentDate = time ? dayjs(time) : dayjs();
  const startDate = currentDate.subtract(days, "day");
  const endDate = currentDate.add(days, "day");
  const formatDateString = (date) => date.format("YYYY-MM-DD");
  return [formatDateString(startDate), formatDateString(endDate)];
}

// 检查日期是否在指定范围内
export function isDateOutsideRange(date, startDate, endDate) {
  const currentDate = dayjs(date);
  return currentDate.isBefore(startDate) || currentDate.isAfter(endDate);
}

export function getWeekDates(date) {
  const startOfWeek = dayjs(date).startOf("week");
  const weekDates = [];

  for (let i = 0; i < 7; i++) {
    const currentDay = startOfWeek.add(i, "day");
    weekDates.push({
      date: currentDay.format("YYYY-MM-DD"),
      week: currentDay.format("dddd"),
      weekChinese: currentDay.format("dd"), // E 表示星期几的缩写
      day: currentDay.format("MM-DD"),
    });
  }

  return weekDates;
}
// 获取本周的周一到周日的日期数组
export function getCurrentWeekDates() {
  const currentDate = dayjs();
  return getWeekDates(currentDate);
}
// 获取给定周一的上一周的周一到周日的日期数组
export function getPreviousWeekDates(mondayDate) {
  const startOfPreviousWeek = dayjs(mondayDate)
    .subtract(1, "week")
    .startOf("week");
  return getWeekDates(startOfPreviousWeek);
}
// 获取给定周日的下一周的周一到周日的日期数组
export function getNextWeekDates(sundayDate) {
  const startOfNextWeek = dayjs(sundayDate).add(1, "week").startOf("week");
  return getWeekDates(startOfNextWeek);
}
// 获取给定日期的日
export function getDayFromDate(dateString) {
  const dateObject = dayjs(dateString);
  return dateObject.format("DD");
}
//获取当天的日期
export function getTodayDate() {
  return dayjs().format("YYYY-MM-DD");
}
//根据传过来的日期转化为年月日，然后往后推7天，返回一个数组，数组里面是对象，对象里面是年月日
export function getSevenDays(date) {
  const currentDate = dayjs(date);
  //获取当前日期往后推7天的日期
  const futureDate = currentDate.add(7, "day");
  const sevenDays = [];
  for (let i = 0; i < 7; i++) {
    const currentDay = currentDate.add(i, "day");
    sevenDays.push({
      date: currentDay.format("YYYY-MM-DD"),
      week: currentDay.format("dddd"),
      weekChinese: currentDay.format("dd"), // E 表示星期几的缩写
      day: currentDay.format("MM-DD"),
    });
  }
  return {
    time: [currentDate.format("YYYY-MM-DD"), futureDate.format("YYYY-MM-DD")],
    sevenDays,
  };
}

// 获取某一周的起始日期和结束日期
export function getWeekRange(date) {
  console.log(dayjs(date));
  const startDate = dayjs(date).startOf("week");
  const endDate = dayjs(date).endOf("week");
  return [startDate.format("YYYY-MM-DD"), endDate.format("YYYY-MM-DD")];
}

export function getWeekOfYear(dateString) {
  const date = dayjs(dateString);
  const weekOfYear = date.isoWeek();
  return weekOfYear;
}
//YYYY-MM-DD HH:mm:ss
/**
 *
 * @param {*} val
 * @param {*} fot
 * @returns
 */
export function getCurrentDate(val = null, fot = "YYYY-MM-DD") {
  const currentDateString = dayjs(val || undefined).format(fot);
  return currentDateString;
}

/**
 * 传入拼接的年月日字符串，返回类似 '2024年8月20日 二' 的字符串
 * @param {string} dateStr - 年月日字符串，格式为 'YYYY-MM-DD'
 * @returns {string} - 返回格式化后的日期字符串，例如 '2024年8月20日 二'
 */
export function getFormattedDate(dateStr) {
  const date = dayjs(dateStr);
  const dayOfWeek = date.day(); // 0 代表周日，1 代表周一，以此类推
  const weekDayMap = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
  return `${date.format("YYYY年M月D日")} ${weekDayMap[dayOfWeek]}`;
}
/**
 * 传入开始和结束的年月日时分秒，并返回格式化的 "开始时分 - 结束时分"
 * @param {*} startDateTime
 * @param {*} endDateTime
 * @returns
 */
export function formatTimeRange(startDateTime, endDateTime) {
  // 使用 dayjs 解析传入的开始和结束时间
  const start = dayjs(startDateTime);
  const end = dayjs(endDateTime);

  // 格式化为 "HH:mm" 格式
  const startDate = start.format("MM月DD日 ( ddd ) ");
  const startTime = start.format("HH:mm");
  const endTime = end.format("HH:mm");

  // 返回 "开始时分 - 结束时分" 的格式
  return `${startDate}  ${startTime} - ${endTime}`;
}

export function formatDateRange(startDate, endDate) {
  const start = dayjs(startDate);
  const end = dayjs(endDate);

  // 如果开始和结束时间是同一天
  if (start.isSame(end, "day")) {
    const dayOfWeek = start.day(); // 0 代表周日，1 代表周一，以此类推
    const weekDayMap = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
    return `${start.format("YYYY年MM月DD日")} ${weekDayMap[dayOfWeek]}`;
  }

  // 如果年份相同
  if (start.isSame(end, "year")) {
    // 如果同一年同一月
    if (start.isSame(end, "month")) {
      return `${start.format("YYYY年MM月DD日")}-${end.format("DD日")}`;
    }
    // 同一年不同月
    return `${start.format("YYYY年MM月DD日")}-${end.format("MM月DD日")}`;
  }

  // 不同年
  return `${start.format("YYYY年MM月DD日")}-${end.format("YYYY年MM月DD日")}`;
}
